package org.example.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.example.config.JacksonSettingSingleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collections;
import java.util.List;

public class JacksonUtils {
    private static final Logger logger = LoggerFactory.getLogger(JacksonUtils.class);
    private static final ObjectMapper mapper = JacksonSettingSingleton.getObjectMapper();

    // 序列化（返回空字符串替代null）
    public static String toJson(Object obj) {
        try {
            return mapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            logError("序列化失败", obj, e);
            return ""; // 返回安全值避免NPE
        }
    }

    // 反序列化单个对象（返回null明确标识失败）
    public static <T> T fromJson(String json, Class<T> clazz) {
        try {
            return mapper.readValue(json, clazz);
        } catch (JsonProcessingException e) {
            logError("反序列化失败", json, e);
            return null;
        }
    }

    // 反序列化集合（返回空集合保证调用方安全）
    public static <T> List<T> listFromJson(String json, Class<T> clazz) {
        try {
            return mapper.readValue(json,
                    mapper.getTypeFactory().constructCollectionType(List.class, clazz));
        } catch (JsonProcessingException e) {
            logError("集合反序列化失败", json, e);
            return Collections.emptyList();
        }
    }

    // 统一错误日志记录
    private static void logError(String operation, Object context, Exception e) {
        String contextInfo = (context instanceof String) ?
                "JSON内容: " + abbreviate((String) context) :
                "对象类型: " + context.getClass().getName();

        logger.error("{} | {} | 错误详情: {}",
                operation,
                contextInfo,
                e.getMessage(),  // 获取Jackson原始错误信息
                e); // 完整堆栈跟踪
    }

    // 截断过长的JSON内容（防止日志爆炸）
    private static String abbreviate(String json) {
        return json.length() > 200 ? json.substring(0, 200) + "..." : json;
    }
}
